home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / bstring / bcmp.c < prev    next >
C/C++ Source or Header  |  1992-05-14  |  3KB  |  95 lines

  1. /* 
  2.  * bcmp.c --
  3.  *
  4.  *    Source code for the "bcmp" library routine.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/src/lib/c/bstring/RCS/bcmp.c,v 1.5 92/05/14 18:58:01 kupfer Exp $ SPRITE (Berkeley)";
  18. #endif not lint
  19.  
  20. #include <bstring.h>
  21. #include <machparam.h>
  22.  
  23. /*
  24.  * The following mask is used to detect proper alignment of addresses
  25.  * for doing word operations instead of byte operations.  It is
  26.  * machine-dependent.  If none of the following bits are set in an
  27.  * address, then word-based operations may be used. This value is imported
  28.  * from machparam.h
  29.  */
  30.  
  31. #define WORDMASK WORD_ALIGN_MASK
  32.  
  33. /*
  34.  *----------------------------------------------------------------------
  35.  *
  36.  * bcmp --
  37.  *
  38.  *    Compare two blocks of memory for equality.  This routine is
  39.  *    optimized to do integer compares.  However, if either sourcePtr
  40.  *    or destPtr points to non-word-aligned addresses then it is
  41.  *    forced to do single-byte compares.
  42.  *
  43.  * Results:
  44.  *    The return value is zero if the blocks at sourcePtr and destPtr
  45.  *    are identical, non-zero if they differ.
  46.  *
  47.  * Side effects:
  48.  *    None.
  49.  *
  50.  *----------------------------------------------------------------------
  51.  */
  52.  
  53. int
  54. bcmp(sourceVoidPtr, destVoidPtr, numBytes)
  55.     _CONST _VoidPtr sourceVoidPtr;     /* Where to compare from */
  56.     _CONST _VoidPtr destVoidPtr;    /* Where to compare to */
  57.     register int numBytes;        /* The number of bytes to compare */
  58. {
  59.     register _CONST char *sourcePtr = sourceVoidPtr;
  60.     register _CONST char *destPtr = destVoidPtr;
  61.  
  62.     /*
  63.      * If both the sourcePtr and the destPtr point to aligned addesses then
  64.      * compare as much as we can in integer units.  Once we have less than
  65.      * a whole int to compare then it must be done by byte compares.
  66.      */
  67.  
  68.     if ((((int) sourcePtr & WORDMASK) == 0)
  69.         && (((int) destPtr & WORDMASK) == 0)) {
  70.     while (numBytes >= sizeof(int)) {
  71.         if (*(int *) destPtr != *(int *) sourcePtr) {
  72.         return 1;
  73.         }
  74.         sourcePtr += sizeof(int);
  75.         destPtr += sizeof(int);
  76.         numBytes -= sizeof(int);
  77.     }
  78.     }
  79.  
  80.     /*
  81.      * Compare the remaining bytes
  82.      */
  83.  
  84.     while (numBytes > 0) {
  85.     if (*destPtr != *sourcePtr) {
  86.         return 1;
  87.     }
  88.     ++destPtr;
  89.     ++sourcePtr;
  90.     numBytes--;
  91.     }
  92.  
  93.     return 0;
  94. }
  95.